Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Rendered • View rawDownload


README.md 01106903cf2f130cfc2687961d7271bdb2a2b936 (01106903) Text, 18.37 KB

Reticulum MeshChatX


A extensively modified and feature-rich fork of Reticulum MeshChat by Liam Cottle.

This project is independent from the original Reticulum MeshChat project and is not affiliated with it.

• Website: meshchatx.com
• Official GitHub Mirror: github.com/Quad4-Software/MeshChatX
• Changelog: CHANGELOG.md

rngit: T383838git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX
NomadNet Node: T383838c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu

Important Changes from Reticulum MeshChat

• Uses LXST for calls
• Replaced Peewee ORM with raw SQL.
• Replaced Axios with native fetch.
• Uses Electron 41.x (bundled Node 24 runtime).
• .whls ships with webserver and built-in frontend assets for more deployment options.
• i18n
• PNPM and Poetry for dependency management.

│ [!WARNING] MeshChatX is not guaranteed to be wire/data compatible with older Reticulum MeshChat
│ releases. Back up data before migration/testing.

│ [!WARNING] Legacy systems are not supported yet. Current baseline is Python T383838>=3.11 and Node T383838>=24
│ (Electron 41 aligns with Node 24; T383838package.json T383838engines and CI use the same line).

Requirements

• Python T383838>=3.11 (from T383838pyproject.toml)
• Node.js T383838>=24 (from T383838package.json T383838engines)
• pnpm T38383810.33.0 (from T383838package.json T383838packageManager)
• Poetry (used by T383838Taskfile.yml and CI workflows)

T282828
task install
task lint:all
task test:all
task build:all

Install Methods

Use the method that matches your environment and packaging preference.

┌───────────────────────┬──────────────────────────┬─────────────────────────────────────────┬─────┐
│ Method │ Includes frontend assets │ Architectures │ Be… │
├───────────────────────┼──────────────────────────┼─────────────────────────────────────────┼─────┤
│ Docker image │ Yes │ T383838linux/amd64, T383838linux/arm64 │ Fa… │
│ Python wheel (T383838.whl) │ Yes │ Any Python-supported architecture │ He… │
│ Linux AppImage │ Yes │ T383838x64, T383838arm64 │ Po… │
│ Debian package (T383838.deb) │ Yes │ T383838x64, T383838arm64 │ De… │
│ RPM package (T383838.rpm) │ Yes │ CI-runner dependent for published arti… │ Fe… │
│ From source │ Built locally │ Host architecture │ De… │
└───────────────────────┴──────────────────────────┴─────────────────────────────────────────┴─────┘

Notes:

• GitHub Actions builds tagged releases: Windows and macOS via T383838.github/workflows/build-release.yml, Linux wheel/AppImage/deb/rpm via T383838.github/workflows/build-linux-release.yml, and the container image via T383838.github/workflows/docker.yml.
• Linux T383838x64 and T383838arm64 AppImage + DEB are built on GitHub; RPM is attempted and uploaded when produced.

Docker

Docker Hub: T383838quad4io/meshchatx
GHCR: T383838ghcr.io/quad4-software/meshchatx

T282828
docker compose up -d

T282828
docker run -d --name reticulum-meshchatx Tffea00\
--restart unless-stopped Tffea00\
--security-opt no-new-privileges:true Tffea00\
-p T79c0ff127.0.0.1:8000:8000 Tffea00\
-v Ta5d6ff"Tff7b72$(Tffa657pwdTff7b72)Ta5d6ff/meshchat-config:/configTa5d6ff" Tffea00\
ghcr.io/quad4-software/meshchatx:latest


You can substitute T383838quad4io/meshchatx:latest for the image if you prefer Docker Hub.

Default compose file maps:

• T383838127.0.0.1:8000 on host -> container port T3838388000
• T383838./meshchat-config -> T383838/config for persistence

If your local T383838meshchat-config permissions block writes, fix ownership:

T282828
sudo chown -R T79c0ff1000:1000 ./meshchat-config


Install from Release Artifacts

1) Linux AppImage (x64/arm64)

1. Download T383838ReticulumMeshChatX-v<version>-linux-<arch>.AppImage from releases.
2. Make it executable and run:

T282828
chmod +x ./ReticulumMeshChatX-v*-linux-*.AppImage
./ReticulumMeshChatX-v*-linux-*.AppImage

2) Debian/Ubuntu T383838.deb (x64/arm64)

1. Download T383838ReticulumMeshChatX-v<version>-linux-<arch>.deb.
2. Install:

T282828
sudo apt install ./ReticulumMeshChatX-v*-linux-*.deb

3) RPM-based systems

1. Download T383838ReticulumMeshChatX-v<version>-linux-<arch>.rpm if present in the release.
2. Install with your distro tool:

T282828
sudo rpm -Uvh ./ReticulumMeshChatX-v*-linux-*.rpm

4) Python wheel (T383838.whl)

Release wheels include the built web assets.

T282828
pip install ./reticulum_meshchatx-*-py3-none-any.whl
meshchatx --headless

T383838pipx is also supported:

T282828
pipx install ./reticulum_meshchatx-*-py3-none-any.whl

Run from Source (Web Server Mode)

Use this when developing or when you need a local custom build.

T282828
git clone https://git.quad4.io/RNS-Things/MeshChatX.git
Tffa657cd MeshChatX
corepack Tffa657enable
pnpm config Tffa657set verify-store-integrity Tffa657true
pnpm install --frozen-lockfile
pip install Ta5d6ff"poetry==2.3.4"
poetry check --lock
poetry install
pnpm run build-frontend
poetry run python -m meshchatx.meshchat --headless --host T79c0ff127.0.0.1


Notes on the install commands above:

• T383838pnpm install --frozen-lockfile refuses to update T383838pnpm-lock.yaml and fails if the lockfile does not match T383838package.json. This is what blocks an unexpected upstream version from being silently pulled in.
• T383838verify-store-integrity=true is also set in the project T383838.npmrc; the explicit T383838pnpm config set line above just hardens the user-level config too.
• Lifecycle scripts (T383838preinstall/T383838postinstall) are blocked by default in pnpm v10+. Only the packages listed under T383838pnpm.onlyBuiltDependencies in T383838package.json are allowed to run install scripts (currently T383838electron, T383838electron-winstaller, T383838esbuild).
• T383838poetry check --lock fails fast if T383838poetry.lock is out of sync with T383838pyproject.toml; T383838poetry install then resolves only from the lockfile.
• For a strict lockfile-only Poetry install (no implicit lockfile refresh), pin Poetry with T383838pip install "poetry==2.3.4" to match what CI uses.

If you intentionally want to update dependencies, run T383838pnpm update / T383838poetry update in a dedicated commit and review the resulting lockfile diff before pushing.

Run sandboxed (Linux)

To run the native T383838meshchatx binary (alias: T383838meshchat) with extra filesystem isolation, you can use Firejail or Bubblewrap (T383838bwrap) while keeping normal network access for Reticulum and the web UI. Full examples (pip/pipx, Poetry, USB serial notes) are in:


The same page appears in the in-app Documentation list (MeshChatX docs) when served from the bundled or synced T383838meshchatx-docs files.

Linux desktop: emoji fonts

The emoji picker renders standard Unicode emoji using your system fonts (Electron/Chromium). If emoji show as empty squares (“tofu”), install a color emoji package and restart the app.

┌────────────────────────────┬──────────────────────────────────────────────────────────────────┐
│ Family (examples) │ Package │
├────────────────────────────┼──────────────────────────────────────────────────────────────────┤
│ Arch Linux, Artix, Manjaro │ T383838noto-fonts-emoji (T383838sudo pacman -S noto-fonts-emoji) │
│ Debian, Ubuntu │ T383838fonts-noto-color-emoji (T383838sudo apt install fonts-noto-color-emoji) │
│ Fedora │ T383838google-noto-emoji-color-fonts
└────────────────────────────┴──────────────────────────────────────────────────────────────────┘

After installing, run T383838fc-cache -fv if glyphs still fail until the next login. Optional: T383838noto-fonts for broader symbol coverage on minimal installs.

Build Desktop Packages from Source

These scripts are defined in T383838package.json and T383838Taskfile.yml.

Linux x64 AppImage + DEB

T282828
pnpm run dist:linux-x64

Linux arm64 AppImage + DEB

T282828
pnpm run dist:linux-arm64

RPM

T282828
pnpm run dist:rpm

Or through Task:

T282828
task dist:fe:rpm

Container build (wheel, AppImage, deb, rpm)

T383838Dockerfile.build runs the same shell-driven steps CI uses (Poetry, pnpm, T383838task, packaging APT deps). It is oriented toward linux/amd64 (NodeSource amd64 tarball, Task amd64 binary). Default target is everything; override with a build arg.

Targets for T383838MESHCHATX_BUILD_TARGETS: T383838all (default), T383838wheel, or T383838electron (AppImage + deb for x64 and arm64, best-effort RPM, no wheel).

Build:

T282828
docker build -f Dockerfile.build -t meshchatx-build:local .

Build only a wheel:

T282828
docker build -f Dockerfile.build --build-arg Te6edf3MESHCHATX_BUILD_TARGETSTff7b72=wheel -t meshchatx-build:wheel .


Copy T383838/artifacts from the finished image to the host:

T282828
Te6edf3cidTff7b72=Tff7b72$(docker create meshchatx-build:localTff7b72)
docker cp Ta5d6ff"Tffd700${Te6edf3cidTffd700}Ta5d6ff:/artifactsTa5d6ff" ./meshchatx-artifacts
docker rm Ta5d6ff"Tffd700${Te6edf3cidTffd700}Ta5d6ff"


Architecture Support Summary

• Docker image: T383838amd64, T383838arm64
• Linux AppImage: T383838x64, T383838arm64
• Linux DEB: T383838x64, T383838arm64
• Windows: T383838x64, T383838arm64 (build scripts available)
• macOS: build scripts available (T383838arm64, T383838universal) for local build environments
• Android: native APKs — ABIs T383838arm64-v8a, T383838x86_64, T383838armeabi-v7a (32-bit ARM), plus universal

Android

MeshChatX supports native Android APK builds (not only Termux).

Build APKs from source

From repo root:

T282828
T8b949e# 1) Build Chaquopy wheels used by android/app/build.gradle
bash scripts/build-android-wheels-local.sh

T8b949e# 2) Build universal APKs (one debug + one release per run; see android/README.md)
Tffa657cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease


There is a single Android variant. Gradle syncs the full T383838meshchatx/ tree into T383838app/src/main/python/meshchatx/, including the offline repository wheel bundle. ABI packaging is T383838universal (default) or T383838split (see T383838android/app/build.gradle).

With T383838-PmeshchatxAbiPackaging=universal (default), each build type is one APK with every selected ABI:

• Debug: T383838android/app/build/outputs/apk/debug/app-debug.apk
• Release: T383838android/app/build/outputs/apk/release/app-release-unsigned.apk

With T383838-PmeshchatxAbiPackaging=split and more than one ABI in T383838-PmeshchatxAbis, Gradle may emit per-ABI APKs as documented in T383838android/README.md.

Notes:

• Release outputs are unsigned by default unless you configure signing (T383838scripts/sign-android-apks.sh).
• Android targets the ABIs listed in T383838android/app/build.gradle (including T383838armeabi-v7a when enabled). Building wheels for T383838armeabi-v7a needs an Android SDK on T383838ANDROID_HOME (see T383838android/README.md).
• Override ABI selection with T383838-PmeshchatxAbis=<comma-separated list> or T383838MESHCHATX_ABIS. Override packaging with T383838-PmeshchatxAbiPackaging=universal|split or T383838MESHCHATX_ABI_PACKAGING.
• If repo root T383838dist/reticulum_meshchatx-*.whl exists (for example from T383838python -m build --wheel -o dist .), bundled repository refresh prefers that wheel over PyPI for the MeshChatX package. CI builds that wheel before the Android Gradle step.

Additional docs:


Configuration

MeshChatX supports both CLI args and env vars.

┌────────────────────────┬──────────────────────────────────────┬──────────────┬───────────────────┐
│ Argument │ Environment Variable │ Default │ Description │
├────────────────────────┼──────────────────────────────────────┼──────────────┼───────────────────┤
│ T383838--host │ T383838MESHCHAT_HOST │ T383838127.0.0.1 │ Web server bind … │
│ T383838--port │ T383838MESHCHAT_PORT │ T3838388000 │ Web server port │
│ T383838--no-https │ T383838MESHCHAT_NO_HTTPS │ T383838false │ Disable HTTPS │
│ T383838--ssl-cert / T383838--ssl-key │ T383838MESHCHAT_SSL_CERT / T383838MESHCHAT_SSL_KEY │ (none) │ PEM certificate … │
│ T383838--rns-log-level │ T383838MESHCHAT_RNS_LOG_LEVEL │ (none) │ Reticulum (RNS) … │
│ T383838--headless │ T383838MESHCHAT_HEADLESS │ T383838false │ Do not auto-laun… │
│ T383838--auth │ T383838MESHCHAT_AUTH │ T383838false │ Enable basic auth │
│ T383838--storage-dir │ T383838MESHCHAT_STORAGE_DIR │ T383838./storage │ Data directory │
│ T383838--public-dir │ T383838MESHCHAT_PUBLIC_DIR │ auto/bundled │ Frontend files d… │
└────────────────────────┴──────────────────────────────────────┴──────────────┴───────────────────┘

Branches

┌────────┬─────────────────────────────────────────────────────────────────┐
│ Branch │ Purpose │
├────────┼─────────────────────────────────────────────────────────────────┤
│ T383838master │ Stable releases. Production-ready code only. │
│ T383838dev │ Active development. May contain breaking or incomplete changes. │
└────────┴─────────────────────────────────────────────────────────────────┘

Development

Common tasks from T383838Taskfile.yml:

T282828
task install
task lint:all
task test:all
task build:all

T383838Makefile shortcuts are also available:

┌──────────────┬─────────────────────────────────────────┐
│ Command │ Description │
├──────────────┼─────────────────────────────────────────┤
│ T383838make install │ Install pnpm and poetry dependencies │
│ T383838make run │ Run MeshChatX via poetry │
│ T383838make build │ Build frontend │
│ T383838make lint │ Run eslint and ruff │
│ T383838make test │ Run frontend and backend tests │
│ T383838make clean │ Remove build artifacts and node_modules │
└──────────────┴─────────────────────────────────────────┘

Versioning

Current version in this repo is T3838384.6.0.

T383838package.json T383838version is the only value you edit for a release bump.
• Run T383838pnpm run version:sync (also run at the start of T383838pnpm run build) to propagate that version into T383838pyproject.toml, T383838meshchatx/src/version.py, T383838THIRD_PARTY_NOTICES.txt (product line), README / lang/README.\* “current version” lines, T383838docs/meshchatx_on_raspberry_pi.md pipx example, and T383838packaging/arch/PKGBUILD helpers.
T383838meshchatx.__version__ is read from T383838meshchatx/src/version.py without importing T383838meshchatx.src, so a plain T383838import meshchatx stays lightweight.
Changelog entries stay manual when you cut a release.

Security

Security and integrity details:

• Built-in integrity checks and HTTPS/WSS defaults in app runtime.
• CI and release builds on GitHub Actions.

Adding a Language

My workflow: ArgosTranslate -> Local LLM (Qwen 3 + Gemma 4)

People are then welcome to submit fixes to me via LXMF or wherever you can contact me.

Locale discovery is automatic. Add a new file under T383838meshchatx/src/frontend/locales/ (for example T383838xx.json) with the same keys as T383838en.json and a top-level T383838_languageName string for the label shown in the language selector. You can copy T383838en.json and translate every value by hand; machine-assisted generation is optional and never required.

Optional: Argos Translate bootstrap -- If you want a machine-generated first draft from T383838en.json, you can use T383838scripts/argos_translate.py. It handles formatting, color output, and helps protect interpolation variables (like T383838{count}) from accidental edits.

T282828
T8b949e# Install argostranslate if you haven't already
pipx install argostranslate

T8b949e# Run the translation script
python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name Ta5d6ff"Your Language Name"


After any machine-assisted pass, have an LLM or a human reviewer verify grammar, context, and tone (for example formal vs informal).

Run T383838pnpm test -- tests/frontend/i18n.test.js --run to verify key parity with T383838en.json.

No other code changes are required. The app, language selector, and tests all discover locales from the T383838meshchatx/src/frontend/locales/ directory at build time.

Credits

Liam Cottle - Original Reticulum MeshChat
RFnexus - micron parser JavaScript work
markqvist - Reticulum, LXMF, LXST

License

Project-owned portions are licensed under 0BSD.
Original upstream portions from Reticulum MeshChat remain under MIT.
See LICENSE for full text and notices.


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────